/**
 * @file OTAUpdate.h
 * @brief OTA更新库的头文件
 * @details 提供固件空中升级(OTA)功能的封装
 */

#ifndef OTA_UPDATE_H
#define OTA_UPDATE_H

#include <Arduino.h>
#include <HTTPClient.h>
#include <HTTPUpdate.h>
#include <ArduinoJson.h>
#include "config.h"
#include "WIFILib.h"

/**
 * @class OTAUpdate
 * @brief OTA更新管理类
 * @details 负责处理固件的版本检查、下载和更新
 */
class OTAUpdate {
public:
    /**
     * @brief 构造函数
     * @param ssid WiFi网络名称
     * @param password WiFi网络密码
     * @param updateServer OTA更新服务器地址
     * @param versionCheckUrl 版本检查URL
     * @param currentVersion 当前固件版本
     */
    OTAUpdate(const char* ssid = WIFI_SSID, 
              const char* password = WIFI_PASSWORD, 
              const char* updateServer = OTA_UPDATE_SERVER, 
              const char* versionCheckUrl = OTA_VERSION_CHECK_URL,
              const char* currentVersion = FIRMWARE_VERSION);
    
    /**
     * @brief 析构函数
     * @details 清理资源，释放内存
     */
    ~OTAUpdate();
    
    /**
     * @brief 启动OTA任务
     * @details 创建并启动OTA更新检查任务
     */
    void startOTATask();
    
    /**
     * @brief 初始化OTA更新
     * @return true: 初始化成功, false: 初始化失败
     */
    bool begin();

private:
    // 配置参数
    const char* _updateServer;     ///< OTA更新服务器地址
    const char* _versionCheckUrl;  ///< 版本检查URL
    const char* _currentVersion;   ///< 当前固件版本
    HTTPClient _http;              ///< HTTP客户端实例
    WIFILib* _wifi;                ///< WiFi库实例
    
    /**
     * @brief 检查更新
     * @return true: 检查成功, false: 检查失败
     * @details 检查是否有新版本可用
     */
    bool checkForUpdates();
    
    /**
     * @brief 执行更新
     * @return true: 更新成功, false: 更新失败
     * @details 下载并安装新版本固件
     */
    bool performUpdate();
    
    /**
     * @brief 安全的HTTP请求
     * @param url 请求URL
     * @param timeout 超时时间(毫秒)
     * @return HTTP响应码
     * @details 带有重试机制的HTTP请求
     */
    int safeHttpRequest(const char* url, int timeout = 5000);
};

#endif // OTA_UPDATE_H 